#include "debug.h"
#include "../DDIC/AllDDIC.h"
#include "usbd_cdc.h"

const u8 RM692E0_Gamma_R[54]=
{
	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
	0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2d,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37	
};
const u8 RM692E0_Gamma_G[54]=
{
	0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,
	0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e
};
const u8 RM692E0_Gamma_B[54]=
{
	0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0xa0,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa9,0xaa,0xab,0xac,
	0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4
};
const u8 RM692E0_Gamma_Points[26] =
{
	 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	 0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
	 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
	 0x19,0x1A
};

void RM692EX_Write_Register(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFfd);
	delay_ms(2);
    SSD2828_W_Array(SigMode,channel,buffer,2);                               

    delay_ms(5);
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    buffer[4] = Uart_Error_None;
    buffer[5] = 0;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写寄存器状态  ：ok  	
}

void RM692EX_Read_Register(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	if(SigMode == Video_Mode)
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
	}
	else if(SigMode == CMD_Mode)	
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
	}                             

	delay_ms(5);
	Mipi_Read(pdev,SigMode,channel,buffer[3],buffer[2]-1,Buffer_ReadCode);
	memcpy(buffer+4,Buffer_ReadCode,buffer[2]-1);
		
	SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
	buffer[1]=2;  //0x02 Read标志位，串口返回数据处理部分
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 读取的 寄存器数据  ：ok 
}


void RM692EX_Write_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    u8 buffer1[5];
    if(SigMode == Video_Mode)
    {
        SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
    }
    else if(SigMode == CMD_Mode)	
		{
		    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
		}
		delay_ms(2);
		if((buffer[3]&0x0F) == 0x01)
    {
        buffer1[0] = 0x02;
        buffer1[1] = 0xFE;
        buffer1[2] = 0x52;                // GAMMA  page52
        SSD2828_W_Array(SigMode,channel,buffer1,0);
    }   
		else
		{
        buffer1[0] = 0x02;
        buffer1[1] = 0xFE;
        buffer1[2] = 0x50;                // GAMMA  page50
        SSD2828_W_Array(SigMode,channel,buffer1,0);
		}
    for( i = 0;i<buffer[2]-1;i++) 
    {	 
        if((buffer[3]&0xf0)==0x00)	
            SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM692E0_Gamma_R[i]);  
        else if((buffer[3]&0xf0)==0x40)
            SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM692E0_Gamma_G[i]); 
        else if((buffer[3]&0xf0)==0x80)
            SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|RM692E0_Gamma_B[i]); 																		
    }
	delay_ms(2);
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    buffer[4] = Uart_Error_None;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3); 
}

void RM692EX_Read_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    u8 buffer1[3];

		if(SigMode == Video_Mode)
    {
        SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
    }
    else if(SigMode == CMD_Mode)	
		{
		    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
		}
		delay_ms(15);
		
		buffer1[0] = 0x02;
		buffer1[1] = 0xFE;
		buffer1[2] = 0x50;                // GAMMA  page50
		SSD2828_W_Array(SigMode,channel,buffer1,0);

    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080); 
    SSD2828_W_Reg(SigMode,channel,0xBC,0x0001);	
    for( i = 0;i<buffer[2]-1;i++)			 	
    {  	
        SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);                                
        buffer1[0] = 0x01;
        buffer1[1] = (buffer[3]==0x00) ? RM692E0_Gamma_R[i] : ((buffer[3]==0x42) ? RM692E0_Gamma_G[i] : RM692E0_Gamma_B[i]);
        SSD2828_W_Array(SigMode,channel,buffer1,0); 
				delay_ms(6);
        buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF);        
    }	
    delay_ms(5);
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ??? Gamma??  :ok  
}

void RM692EX_AutoGamma_UDC(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	  u8 buffer1[3];
    if(SigMode == Video_Mode)
    {
        SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
    }
    else if(SigMode == CMD_Mode)	
		{
		    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
		}
		delay_ms(5);
	
		//SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);	
		buffer1[0] = 0x02;			
		buffer1[1] = 0xFE;
		buffer1[2] = 0x50;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
		delay_ms(1);
		SSD2828_W_Reg(SigMode,channel,0xBC,0x02);
    for( i = 0;i<buffer[2]-1;i++) 
    {	 
			SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|buffer[i+3]);  
			i++;
			delay_ms(2);
    }				
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
}

void RM692EX_AutoGamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	  u8 buffer1[3];

    if(SigMode == Video_Mode)
    {
        SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
    }
    else if(SigMode == CMD_Mode)	
		{
		    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
		}
		delay_ms(5);	
	
	//SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);	
		buffer1[0] = 0x02;			
		buffer1[1] = 0xFE;
		buffer1[2] = 0x50;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
		delay_ms(1);
		SSD2828_W_Reg(SigMode,channel,0xBC,0x02);
    for( i = 0;i<buffer[2]-1;i++) 
    {	 
			SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|buffer[i+3]);  
			i++;
			delay_ms(2);
    }				
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
}

void RM692EX_Gamma_Mapping(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
		u8 buffer1[5];
		if(SigMode == Video_Mode)
    {
        SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
    }
    else if(SigMode == CMD_Mode)	
		{
		    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
		}
		delay_ms(5);
		buffer1[0] = 0x02;
		buffer1[1] = 0xfe;
		buffer1[2] = 0x70;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
	
		buffer1[1] = 0x48;
		buffer1[2] = buffer[3];
		SSD2828_W_Array(SigMode,channel,buffer1,0);		
	
		for( i = 1;i<buffer[2];i++) 
		{	 
			SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+3]<<8)|RM692E0_Gamma_Points[i]);   																	
			delay_ms(1);
		}
		SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
		buffer[4] = Uart_Error_None;
		STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写Gamma状态  ：ok  		
}

void RM692EX_inter_gamma_setting(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 buffer1[5];
	if(SigMode == Video_Mode)
    {
        SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
    }
    else if(SigMode == CMD_Mode)	
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
	}
	delay_ms(5);

    buffer1[0] = 0x02;
    buffer1[1] = 0xFE;
    buffer1[2] = 0x70;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  		
		
	buffer1[1] = 0x28;
	buffer1[2] = 0x00;
	SSD2828_W_Array(SigMode,channel,buffer1,0); ////Disable gamma int

	buffer1[1] = 0xFE;
	buffer1[2] = 0x40;
	SSD2828_W_Array(SigMode,channel,buffer1,0); 	

	buffer1[1] = 0xDA;
	buffer1[2] = 0xC8;
	SSD2828_W_Array(SigMode,channel,buffer1,0);	////Enable measure  mode //15point
	
	buffer1[1] = 0xD7;
	buffer1[2] = buffer[3];
	SSD2828_W_Array(SigMode,channel,buffer1,0);	////gamma  x
	
	buffer1[1] = 0xFE;
	buffer1[2] = 0x78;
	SSD2828_W_Array(SigMode,channel,buffer1,0);

	buffer1[1] = 0xF4;
	buffer1[2] = 0xC0;
	SSD2828_W_Array(SigMode,channel,buffer1,0);
	
	buffer1[1] = 0xF5;
	buffer1[2] = buffer[3];
	SSD2828_W_Array(SigMode,channel,buffer1,0);	////gamma  x
	
	SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
	buffer[4] = Uart_Error_None;
	STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写Gamma状态  ：ok  	
}

void RM692EX_GIR_setting(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 buffer1[5];
	if(SigMode == Video_Mode)
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
	}
	else if(SigMode == CMD_Mode)	
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
	}
	delay_ms(5);
    buffer1[0] = 0x02;
    buffer1[1] = 0xFE;
    buffer1[2] = 0x36;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  
    buffer1[1] = 0x26;
    buffer1[2] = buffer[3]&0x03;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  
    buffer1[1] = 0x27;
    buffer1[2] = buffer[4];
    SSD2828_W_Array(SigMode,channel,buffer1,0);  
    buffer1[1] = 0x28;
    buffer1[2] = buffer[5];
    SSD2828_W_Array(SigMode,channel,buffer1,0);  
    buffer1[1] = 0x29;
    buffer1[2] = buffer[6];
    SSD2828_W_Array(SigMode,channel,buffer1,0); 	
    buffer1[1] = 0x2A;
    buffer1[2] = buffer[7];
    SSD2828_W_Array(SigMode,channel,buffer1,0); 
	SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
	buffer[4] = Uart_Error_None;
	STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写Gamma状态  ：ok  		
}

void RM692EX_exit_gamma_setting(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 buffer1[5];
	if(SigMode == Video_Mode)
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
	}
	else if(SigMode == CMD_Mode)	
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
	}
	delay_ms(5);

    buffer1[0] = 0x02;
    buffer1[1] = 0xFE;
    buffer1[2] = 0x40;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  		

	buffer1[1] = 0xDA;
	buffer1[2] = 0x88;
	SSD2828_W_Array(SigMode,channel,buffer1,0); 	//Disable Measure mode //15point

	buffer1[1] = 0xFE;
	buffer1[2] = 0x78;
	SSD2828_W_Array(SigMode,channel,buffer1,0); 	
	
	buffer1[1] = 0xF4;
	buffer1[2] = 0x80;
	SSD2828_W_Array(SigMode,channel,buffer1,0);//Disable Gamma measure 	
	
	buffer1[1] = 0xFE;
	buffer1[2] = 0x70;
	SSD2828_W_Array(SigMode,channel,buffer1,0); 	
	
	buffer1[1] = 0x28;
	buffer1[2] = 0x01;
	SSD2828_W_Array(SigMode,channel,buffer1,0); 	//enable Gamma int
	
	SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
	buffer[4] = Uart_Error_None;
	STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写Gamma状态  ：ok  	
}

void RM692EX_Gamma_OTP_Start(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
		u8 buffer1[5];
		SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
		delay_ms(5);

    buffer1[0] = 0x02;
    buffer1[1] = 0xFE;
    buffer1[2] = 0x00;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  		

		buffer1[0] = 0x01;
		buffer1[1] = 0x28;
		SSD2828_W_Array(SigMode,channel,buffer1,0); 	
		delay_ms(200);
		buffer1[0] = 0x01;
		buffer1[1] = 0x10;
		SSD2828_W_Array(SigMode,channel,buffer1,0); 	
		delay_ms(200);	

//------page Enable-------------------
//------page Enable-------------------
    if(buffer[4]==5)//P-26H,P-28H,P-32H,P-40H,42,60,62,70,72,74,78,82,90,98,A0,D0,D4,D6
		{
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0xAA;
				SSD2828_W_Array(SigMode,channel,buffer1,0);    
  
			if(buffer[3]==6)////sixth times-----待启用
			{
//						buffer1[1] = 0xFE;
//						buffer1[2] = 0xAB;
//						SSD2828_W_Array(SigMode,channel,buffer1,0); 
//						
//						buffer1[1] = 0x39;
//						buffer1[2] = 0x80;
//						SSD2828_W_Array(SigMode,channel,buffer1,0); //page C2
//						buffer1[1] = 0x3A;
//						buffer1[2] = 0x40;
//						SSD2828_W_Array(SigMode,channel,buffer1,0);//page C4
//						buffer1[1] = 0x3B;
//						buffer1[2] = 0x20;
//						SSD2828_W_Array(SigMode,channel,buffer1,0);//page C6
			}
			else if(buffer[3]==5)////fifth times-----待启用
			{
//						buffer1[1] = 0xFE;
//						buffer1[2] = 0xAB;
//						SSD2828_W_Array(SigMode,channel,buffer1,0); 
//						
//						buffer1[1] = 0x39;
//						buffer1[2] = 0x40;
//						SSD2828_W_Array(SigMode,channel,buffer1,0); //page C2
//						buffer1[1] = 0x3A;
//						buffer1[2] = 0x20;
//						SSD2828_W_Array(SigMode,channel,buffer1,0);//page C4
//						buffer1[1] = 0x3B;
//						buffer1[2] = 0x10;
//						SSD2828_W_Array(SigMode,channel,buffer1,0);//page C6
			}
			else if(buffer[3]==4)////fourth times-----待启用
			{
//						buffer1[1] = 0xFE;
//						buffer1[2] = 0xAB;
//						SSD2828_W_Array(SigMode,channel,buffer1,0); 
//						
//						buffer1[1] = 0x39;
//						buffer1[2] = 0x20;
//						SSD2828_W_Array(SigMode,channel,buffer1,0); //page C2
//						buffer1[1] = 0x3A;
//						buffer1[2] = 0x10;
//						SSD2828_W_Array(SigMode,channel,buffer1,0);//page C4
//						buffer1[1] = 0x3B;
//						buffer1[2] = 0x08;
//						SSD2828_W_Array(SigMode,channel,buffer1,0);//page C6
			}
			else if(buffer[3]==3)////third times
			{
						buffer1[1] = 0x7B;
						buffer1[2] = 0x24;
						SSD2828_W_Array(SigMode,channel,buffer1,0); //page 40\42
						buffer1[1] = 0x7E;
						buffer1[2] = 0x09;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ////page 72\74
						buffer1[1] = 0x7F;
						buffer1[2] = 0x21;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ////page 78\82
						
						buffer1[1] = 0xFE;
						buffer1[2] = 0xAB;
						SSD2828_W_Array(SigMode,channel,buffer1,0);   //switch page  
						buffer1[1] = 0x3D;
						buffer1[2] = 0x40;
						SSD2828_W_Array(SigMode,channel,buffer1,0);///page D0
						buffer1[1] = 0x3F;
						buffer1[2] = 0x08;
						SSD2828_W_Array(SigMode,channel,buffer1,0);////page  D6
			}
			else if(buffer[3]==2)////second times
			{
						buffer1[1] = 0x79;
						buffer1[2] = 0x28;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 26\28
						buffer1[1] = 0x7A;
						buffer1[2] = 0x02;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 32
						buffer1[1] = 0x7B;
						buffer1[2] = 0x12;
						SSD2828_W_Array(SigMode,channel,buffer1,0); //page 40\42
						buffer1[1] = 0x7C;
						buffer1[2] = 0x28;
						SSD2828_W_Array(SigMode,channel,buffer1,0); //page60\62
						buffer1[1] = 0xE0;
						buffer1[2] = 0x02;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 70
						buffer1[1] = 0x7D;
						buffer1[2] = 0x80;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 72
						buffer1[1] = 0x7E;
						buffer1[2] = 0x84;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ////page 74\78
						buffer1[1] = 0x7F;
						buffer1[2] = 0x10;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ////page 82
						buffer1[1] = 0x80;
						buffer1[2] = 0x80;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 90
						buffer1[1] = 0x82;
						buffer1[2] = 0x02;
						SSD2828_W_Array(SigMode,channel,buffer1,0); 	///page A0	
						
						buffer1[1] = 0xFE;
						buffer1[2] = 0xAB;
						SSD2828_W_Array(SigMode,channel,buffer1,0);   //switch page  
						buffer1[1] = 0x39;
						buffer1[2] = 0x01;
						SSD2828_W_Array(SigMode,channel,buffer1,0);   ////page 98  		
						buffer1[1] = 0x3D;
						buffer1[2] = 0x20;
						SSD2828_W_Array(SigMode,channel,buffer1,0);///page D0
						buffer1[1] = 0x3F;
						buffer1[2] = 0x24;
						SSD2828_W_Array(SigMode,channel,buffer1,0);////page D4\D6
			}				
			else  ////first times
				{
						buffer1[1] = 0x79;
						buffer1[2] = 0x14;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 26\28
						buffer1[1] = 0x7A;
						buffer1[2] = 0x01;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 32
						buffer1[1] = 0x7B;
						buffer1[2] = 0x09;
						SSD2828_W_Array(SigMode,channel,buffer1,0); //page 40\42
						buffer1[1] = 0x7C;
						buffer1[2] = 0x14;
						SSD2828_W_Array(SigMode,channel,buffer1,0); //page60\62
						buffer1[1] = 0xE0;
						buffer1[2] = 0x01;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 70
						buffer1[1] = 0x7D;
						buffer1[2] = 0x40;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 72
						buffer1[1] = 0x7E;
						buffer1[2] = 0x42;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ////page 74\78
						buffer1[1] = 0x7F;
						buffer1[2] = 0x08;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 82
						buffer1[1] = 0x80;
						buffer1[2] = 0x40;
						SSD2828_W_Array(SigMode,channel,buffer1,0); ///page 90
						buffer1[1] = 0x82;
						buffer1[2] = 0x01;
						SSD2828_W_Array(SigMode,channel,buffer1,0); 	///page A0	

						buffer1[1] = 0xFE;
						buffer1[2] = 0xAB;
						SSD2828_W_Array(SigMode,channel,buffer1,0);     //switch page 
						buffer1[1] = 0x39;
						buffer1[2] = 0x01;
						SSD2828_W_Array(SigMode,channel,buffer1,0);     	////page 98 	
						buffer1[1] = 0x3D;
						buffer1[2] = 0x10;
						SSD2828_W_Array(SigMode,channel,buffer1,0);///page D0
						buffer1[1] = 0x3F;
						buffer1[2] = 0x12;
						SSD2828_W_Array(SigMode,channel,buffer1,0);///page D4\D6
				}
				
		}
		else if(buffer[4]==6)///RCN
		{
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0xAB;
				SSD2828_W_Array(SigMode,channel,buffer1,0); 
				
				if(buffer[3]==2)////second times
				{
						buffer1[0] = 0x02;
						buffer1[1] = 0x42;
						buffer1[2] = 0x08;
						SSD2828_W_Array(SigMode,channel,buffer1,0); 
				}
				else  ////first times
				{				
						buffer1[0] = 0x02;
						buffer1[1] = 0x42;
						buffer1[2] = 0x04;
						SSD2828_W_Array(SigMode,channel,buffer1,0); 
				}
				 
		}
		else if(buffer[4]==7)////demura   page  14\18\20\22     *page 40 add  DC,C0(demura en)
		{
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0xAA;
				SSD2828_W_Array(SigMode,channel,buffer1,0); ///switch page
				
				if(buffer[3]==2)//second times
				{	
					buffer1[1] = 0x77;
					buffer1[2] = 0x20;
					SSD2828_W_Array(SigMode,channel,buffer1,0); //////page 14
					buffer1[1] = 0x78;
					buffer1[2] = 0xA2;
					SSD2828_W_Array(SigMode,channel,buffer1,0); //////page 18\20\22
				}
				else
				{
						buffer1[1] = 0x77;
						buffer1[2] = 0x10;
						SSD2828_W_Array(SigMode,channel,buffer1,0); //////page 14
						buffer1[1] = 0x78;
						buffer1[2] = 0x51;
						SSD2828_W_Array(SigMode,channel,buffer1,0); //////page 18\20\22
				}
		}
		else if(buffer[4]==1)///gamma
		{
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0xAC;
				SSD2828_W_Array(SigMode,channel,buffer1,0); 
				
				if(buffer[3]==2)//second times
				{			
										buffer1[0] = 0x02;
										buffer1[1] = 0xE0+(buffer[5]/4);
										if(buffer[5] >= 68)//////gamma68之后特殊处理
										{
												buffer1[1] = buffer1[1]+1;
										}
										buffer1[2] = (0x01<<((buffer[5]%4)*2+1));
										SSD2828_W_Array(SigMode,channel,buffer1,0);
				}
				else   ////first times
				{
										buffer1[0] = 0x02;
										buffer1[1] = 0xE0+(buffer[5]/4);
										if(buffer[5] >= 68)//////gamma68之后特殊处理
										{
												buffer1[1] = buffer1[1]+1;
										}
										buffer1[2] = (0x01<<((buffer[5]%4)*2));
										SSD2828_W_Array(SigMode,channel,buffer1,0);						
				}

		}
//		//------page Enable-------------------

////--------------------
		buffer1[0] = 0x02;
    buffer1[1] = 0xFE;
    buffer1[2] = 0xFF;
    SSD2828_W_Array(SigMode,channel,buffer1,0);     
		buffer1[0] = 0x02;
    buffer1[1] = 0xD3;
    buffer1[2] = 0x00;
    SSD2828_W_Array(SigMode,channel,buffer1,0); ////inter power
    buffer1[0] = 0x02;
    buffer1[1] = 0xF3;
    buffer1[2] = 0xA5;
    SSD2828_W_Array(SigMode,channel,buffer1,0);   
     
    buffer1[0] = 0x02;
    buffer1[1] = 0xF4;
    buffer1[2] = 0x5A;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  
    buffer1[0] = 0x02;
    buffer1[1] = 0xF5;
    buffer1[2] = 0x3C;
    SSD2828_W_Array(SigMode,channel,buffer1,0);  
		
		buffer1[0] = 0x02;
    buffer1[1] = 0xF2;
    buffer1[2] = 0x01;
    SSD2828_W_Array(SigMode,channel,buffer1,0); 		
    delay_ms(1500);         // wait for >1500ms   
    
		buffer[4] = Uart_Error_None;
    buffer[1] = 0x07;
	  buffer[2] = 0x03;	
    buffer[0] = 0x4F;		
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //返回 写OTP状态  ：ok		
		
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);		
}

//---------------------------------------------------------------------------------------------------------------
void RM692EX_Read_MTP_Time(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 buffer1[3];	

	u8 Addr[]={0xB4,0xB3,0xB2,0xB7,0xB6,0xB5};
	
	SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);		
		delay_ms(5);
		SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);    
			buffer1[0] = 0x02;
			buffer1[1] = 0xfe;
			buffer1[2] = 0x44;
			SSD2828_W_Array(SigMode,channel,buffer1,0); 
			delay_ms(20);		
	  for(i=0;i<6;i++)
		{
			SSD2828_W_Reg(SigMode,channel,0xB7,((HS_B7_Data|0x0010)&0XFFFD)|0x0080);  //bit7 1:??? bit4 1:HS CLOCK Disable
			delay_ms(5);					
			SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);                                
			buffer1[0] = 0x01;
			buffer1[1] = Addr[i];
			SSD2828_W_Array(SigMode,channel,buffer1,0); 
			delay_ms(20);
			buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF);
		}
		SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    delay_ms(5);
		
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);
}

//---20190713-----RM692EX_Read_All_MTP_Reg
void RM692EX_Read_All_MTP_Reg(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 SendBuff[3];	
	u8 Addr[21]={0xe7,0xe6,0xAE ,0xAF ,0xB0 ,0xB1 ,0xB4 ,0xB3 ,0xB2 ,0xA9 ,0xAA,0xAB,0xBA,0xBB,0xAD ,0xAC ,0xB7 ,0xB6,0xB5,0xB9 ,0xB8};
	//---READ 0xD0	
	SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);		
	delay_ms(5);
	
	SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);    
	SendBuff[0] = 0x02;
	SendBuff[1] = 0xfe;
	SendBuff[2] = 0xD0;
	SSD2828_W_Array(SigMode,channel,SendBuff,0); 
	delay_ms(20);		
	for(i=0;i<2;i++)
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,((HS_B7_Data|0x0010)&0XFFFD)|0x0080);  //bit7 1:??? bit4 1:HS CLOCK Disable
		delay_ms(5);					
		SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);                                
		SendBuff[0] = 0x01;
		SendBuff[1] = Addr[i];
		SSD2828_W_Array(SigMode,channel,SendBuff,0); 
		delay_ms(20);
		buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF);
	}
	//---READ 0x44
	SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);		
	delay_ms(5);
	
	SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);    
	SendBuff[0] = 0x02;
	SendBuff[1] = 0xfe;
	SendBuff[2] = 0x44;
	SSD2828_W_Array(SigMode,channel,SendBuff,0); 
	delay_ms(20);		
	for(i=2;i<21;i++)
	{
		SSD2828_W_Reg(SigMode,channel,0xB7,((HS_B7_Data|0x0010)&0XFFFD)|0x0080);  //bit7 1:??? bit4 1:HS CLOCK Disable
		delay_ms(5);					
		SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);                                
		SendBuff[0] = 0x01;
		SendBuff[1] = Addr[i];
		SSD2828_W_Array(SigMode,channel,SendBuff,0); 
		delay_ms(20);
		buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF);
	}
	
	SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    delay_ms(5);
		
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);
}
//-----------------------------------------------------------------------------

void ProcessForIc64( USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8 buffer[],u16 LP_B7_Data,u16 HS_B7_Data)
{	
	//void *pdev;
	switch(buffer[1])
	{
		case 0x01:                                      //写寄存器
				RM692EX_Write_Register(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
		case 0x02:                                      //读寄存器
				RM692EX_Read_Register(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
		case 0x03:                                      //写Gamma
				RM692EX_Write_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
		case 0x04:                                      //写Gamma
				RM692EX_Read_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;				
		case 0x05:   									// auto Gamma数据
			  RM692EX_AutoGamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
		break;	
		case 0x06: 
				RM692EX_Gamma_Mapping(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);	
		case 0x07:                                      //读Gamma
				RM692EX_Gamma_OTP_Start(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
				break;
		case 0x08:                                      //inter gamma measure mod
				RM692EX_inter_gamma_setting(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
				break;
		case 0x09:                                      //exit gamma measure mod
				RM692EX_exit_gamma_setting(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
				break;
		case 0xAA:                                      //exit gamma measure mod
				RM692EX_GIR_setting(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
				break;
		case 0x0B:
				RM692EX_Read_MTP_Time(pdev,ep_addr,SigMode ,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
        case 0x1B:
				RM692EX_Read_All_MTP_Reg(pdev,ep_addr,SigMode ,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
		case 0xDC: 
				RM692EX_AutoGamma_UDC(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
		break;			
		default:break;
	}			
}




